package com.xg.controller;

import com.alibaba.excel.EasyExcel;
import com.xg.model.entity.OneData;
import com.xg.model.entity.TwoData;
import com.xg.model.enums.DefaultEnums;
import com.xg.util.export.ExcelExporter;
import com.xg.util.export.SheetData;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Excel导出控制器
 * 提供Excel导出功能，支持多Sheet导出和数据样式定制
 */
@Controller
@RequestMapping("/excelExporter")
public class ExcelExporterController {

    /**
     * 直接导出接口，支持浏览器下载
     */
    @GetMapping("/exportOne")
    public void exportData(HttpServletResponse response) throws IOException {
        // 获取数据
        List<OneData> oneDataList = generateFirstSheetData();

        // 设置响应头
        String fileName = URLEncoder.encode("OneData导出", "UTF-8");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

        // 使用 EasyExcel 写入响应输出流
        EasyExcel.write(response.getOutputStream(), OneData.class)
                .sheet("数据列表")
                .doWrite(oneDataList);
    }
    /**
     * 导出多Sheet Excel文件
     * 优化点：减少测试数据量，仅保留必要的特殊行标记
     */
    @GetMapping("/export")
    public void exportExcel() {
        long startTime = System.currentTimeMillis();
        String exportFileName = "测试多Sheet导出.xlsx";

        List<SheetData<?>> sheetDataList = new ArrayList<>();

        // 生成第一页数据 (优化：减少到1000条数据，仅前3条标记特殊样式)
        List<OneData> oneDataList = generateFirstSheetData();
        Map<String, Object> headerInfo1 = createHeaderInfo("这是第一页的标题", "这里是备注信息", "这里是查询条件");
        // 获取OneData类的字段列表（包含@ExcelProperty注解的字段）
        List<Field> oneDataFields = getEntityFields(OneData.class);
        sheetDataList.add(new SheetData<>("第一页", oneDataList, OneData.class, headerInfo1,"查询条件",oneDataFields));

        // 生成第二页数据
        List<TwoData> twoDataList = generateSecondSheetData();
        Map<String, Object> summaryInfo = createSummaryInfo("2020-03-14", "100");
        // 获取TwoData类的字段列表
        List<Field> twoDataFields = getEntityFields(TwoData.class);
        sheetDataList.add(new SheetData<>("第二页", twoDataList, TwoData.class, summaryInfo,"第二页查询条件",twoDataFields));

        // 调用导出工具类执行Excel导出
        ExcelExporter.exportWithoutTemplate(exportFileName, sheetDataList);

        System.out.println("Excel导出耗时：" + (System.currentTimeMillis() - startTime) + "ms");
    }


    /**
     * 生成第一页测试数据
     * 优化点：
     * 1. 减少数据量（从50000→1000）
     * 2. 仅对前3条数据设置特殊样式，避免不必要的样式处理
     */
    private List<OneData> generateFirstSheetData() {
        List<OneData> data = new ArrayList<>();
        for (int i = 1; i <= 50000; i++) {
            OneData item = new OneData(i, "测试0" + i, String.valueOf(10 + i));

            // （用于样式展示）
            if (i == 1) {
                item.setOperationType(DefaultEnums.UPDATE.getMsg());
                item.setModifiedField("name");
            } else if (i == 2) {
                item.setOperationType(DefaultEnums.DELETE.getMsg());
            } else if (i == 3) {
                item.setOperationType(DefaultEnums.INSERT.getMsg());
            }else if (i == 50000) {
                item.setOperationType(DefaultEnums.INSERT.getMsg());
            }

            data.add(item);
        }
        return data;
    }

    /**
     * 生成第二页测试数据
     */
    private List<TwoData> generateSecondSheetData() {
        List<TwoData> data = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            TwoData item = new TwoData(i, "测试0" + i, "2" + i);

            // 标记特殊操作行
            if (i == 3) {
                item.setOperationType(DefaultEnums.UPDATE.getMsg());
                item.setModifiedField("name");
            } else if (i == 4) {
                item.setOperationType(DefaultEnums.DELETE.getMsg());
            } else if (i == 6) {
                item.setOperationType(DefaultEnums.INSERT.getMsg());
            }

            data.add(item);
        }
        return data;
    }

    /**
     * 创建表头信息Map
     * 包含标题、备注和查询条件
     */
    private Map<String, Object> createHeaderInfo(String title, String remark, String criteria) {
        Map<String, Object> info = new HashMap<>();
        info.put("title", title);
        info.put("remark", remark);
        info.put("queryCriteria", criteria);
        return info;
    }

    /**
     * 创建汇总信息Map
     * 包含日期和总计数据
     */
    private Map<String, Object> createSummaryInfo(String date, String total) {
        Map<String, Object> info = new HashMap<>();
        info.put("date", date);
        info.put("total", total);
        return info;
    }

    // 辅助方法：获取实体类中带有@ExcelProperty注解的字段
    private List<Field> getEntityFields(Class<?> entityClass) {
        List<Field> fields = new ArrayList<>();
        for (Field field : entityClass.getDeclaredFields()) {
            if (field.isAnnotationPresent(com.alibaba.excel.annotation.ExcelProperty.class)) {
                fields.add(field);
            }
        }
        return fields;
    }
}